Jerry's Log

INTO & MERGE

contents

1부: INTO

SQL에서 INTO는 방향을 나타내는 키워드입니다. 데이터베이스에게 데이터를 어디에 넣을지 알려줍니다. 함께 짝을 이루는 명령어에 따라 역할이 크게 달라집니다.

1. INSERT INTO (표준 데이터 삽입)

가장 흔한 사용법입니다. 어떤 테이블이 새로운 행(Row)을 받을지 지정합니다.

INSERT INTO Employees (id, name, salary) 
VALUES (1, 'Alice', 50000);

2. SELECT ... INTO (테이블 생성 및 복사)

이것은 SELECT 쿼리의 결과를 이용해 새로운 테이블을 생성하고 동시에 데이터를 채워 넣는 매우 강력한 명령어입니다.

-- 'IT_Employees'라는 새 테이블을 만들고
-- IT 부서 직원들의 데이터를 복사해 넣습니다.
SELECT id, name, salary 
INTO IT_Employees 
FROM Employees 
WHERE department = 'IT';

3. 변수에 값 넣기 (스토어드 프로시저)

스토어드 프로시저(Oracle의 PL/SQL 등)를 작성할 때, INTO는 테이블에서 하나의 값을 꺼내 지역 변수(Variable) 에 저장할 때 사용됩니다.

-- (Oracle PL/SQL 예시)
DECLARE v_max_salary INT;
BEGIN
    SELECT MAX(salary) INTO v_max_salary FROM Employees;
    -- 이제 v_max_salary 변수를 로직에 사용할 수 있습니다.
END;

2부: MERGE 문 ("Upsert" 기능)

1. MERGE란 무엇인가?

MERGE 문은 INSERT, UPDATE, DELETE를 하나로 결합한 명령어입니다. 흔히 "Upsert" (Update + Insert의 합성어)라고 부릅니다.

타겟 테이블(수정하려는 원본 테이블)과 소스 테이블(새로 들어온 데이터)을 비교하여, 일치하는 데이터가 있는지 없는지에 따라 각기 다른 작업을 수행할 수 있게 해줍니다.

2. MERGE의 구조

MERGE 문은 크게 4가지 부분으로 나뉩니다:

  1. MERGE INTO target: 수정될 대상 테이블.
  2. USING source: 비교할 새 데이터 (소스).
  3. ON condition: 두 테이블을 연결할 조건 (주로 Primary Key).
  4. WHEN MATCHED / NOT MATCHED: 조건 일치 여부에 따른 행동 지시.

3. 실무 문법 예시

물류 창고를 상상해 보세요. 메인 Inventory(재고) 테이블이 있고, 매일 밤 DailyShipments(일일 입고) 테이블이 들어옵니다. 재고를 동기화해야 합니다.

MERGE INTO Inventory AS Target
USING DailyShipments AS Source
ON Target.ProductID = Source.ProductID

-- 시나리오 1: 창고에 이미 존재하는 상품인 경우.
-- 행동: 기존 수량에 새 수량을 더합니다 (UPDATE).
WHEN MATCHED THEN 
    UPDATE SET Target.Quantity = Target.Quantity + Source.Quantity

-- 시나리오 2: 창고에 한 번도 들어온 적 없는 신상품인 경우.
-- 행동: 창고 목록에 새로 추가합니다 (INSERT).
WHEN NOT MATCHED BY TARGET THEN 
    INSERT (ProductID, Quantity) 
    VALUES (Source.ProductID, Source.Quantity)

-- 시나리오 3 (선택 사항): 창고에는 있는데 오늘 입고 목록엔 없는 경우.
-- 행동: 재고 목록에서 삭제합니다 (또는 품절 처리).
WHEN NOT MATCHED BY SOURCE THEN 
    DELETE;

4. 데이터베이스별 지원 및 대안

MERGE는 ANSI SQL 표준이지만, DBMS 벤더마다 지원 방식이 다릅니다:

5. MERGE의 장단점

references